use rust_practice::search::minimum_moves_to_move_a_box_to_their_target_location::Solution;

#[test]
fn min_push_box() {
    // 示例 1：
    // 输入：grid = [["#","#","#","#","#","#"],
    //             ["#","T","#","#","#","#"],
    //             ["#",".",".","B",".","#"],
    //             ["#",".","#","#",".","#"],
    //             ["#",".",".",".","S","#"],
    //             ["#","#","#","#","#","#"]]
    // 输出：3
    // 解释：我们只需要返回推箱子的次数。
    let grid = vec![
        vec!['#', '#', '#', '#', '#', '#'],
        vec!['#', 'T', '#', '#', '#', '#'],
        vec!['#', '.', '.', 'B', '.', '#'],
        vec!['#', '.', '#', '#', '.', '#'],
        vec!['#', '.', '.', '.', 'S', '#'],
        vec!['#', '#', '#', '#', '#', '#'],
    ];
    assert_eq!(Solution::min_push_box(grid), 3);

    // 示例 2：
    // 输入：grid = [["#","#","#","#","#","#"],
    //              ["#","T","#","#","#","#"],
    //              ["#",".",".","B",".","#"],
    //              ["#","#","#","#",".","#"],
    //              ["#",".",".",".","S","#"],
    //              ["#","#","#","#","#","#"]]
    // 输出：-1
    let grid = vec![
        vec!['#', '#', '#', '#', '#', '#'],
        vec!['#', 'T', '#', '#', '#', '#'],
        vec!['#', '.', '.', 'B', '.', '#'],
        vec!['#', '#', '#', '#', '.', '#'],
        vec!['#', '.', '.', '.', 'S', '#'],
        vec!['#', '#', '#', '#', '#', '#'],
    ];
    assert_eq!(Solution::min_push_box(grid), -1);

    // 示例 3：
    // 输入：grid = [["#","#","#","#","#","#"],
    //              ["#","T",".",".","#","#"],
    //              ["#",".","#","B",".","#"],
    //              ["#",".",".",".",".","#"],
    //              ["#",".",".",".","S","#"],
    //              ["#","#","#","#","#","#"]]
    // 输出：5
    // 解释：向下、向左、向左、向上再向上。
    let grid = vec![
        vec!['#', '#', '#', '#', '#', '#'],
        vec!['#', 'T', '.', '.', '#', '#'],
        vec!['#', '.', '#', 'B', '.', '#'],
        vec!['#', '.', '.', '.', '.', '#'],
        vec!['#', '.', '.', '.', 'S', '#'],
        vec!['#', '#', '#', '#', '#', '#'],
    ];
    assert_eq!(Solution::min_push_box(grid), 5);
}
